/***********************************************************************************
 * 文件名： mbre.h
 * 作者： 刘言
 * 版本： 3.1
 * 说明：
 * 		Smart Mist Communication Protocol (MBRE) 3.0 通信协议（网络层）的实现。
 *      单缓存覆盖机制：发送方每次发送数据都会复写缓存，所以发送方必须确保接收方已经处理了上
 *  一包数据才能发送下一包数据。
 * 修改记录：
 * 	2021/2/1: 初版。 刘言。
 *  2021/4/12: 增加加密通信功能。 刘言
 *  2021/4/14: 增加主机功能，主从可任意切换。
***********************************************************************************/
#ifndef _MBRE_H_
#define _MBRE_H_

#include "mbre_common.h"  
#include "mbre_link.h"

// APIs

/**
 * 初始化。内部包括了硬件端口驱动的初始化调用（依据配置文件）。
*/
void Mbre_Init();

/**
 * 设置回掉函数（事件通知函数）。
 * @param callback_func   期望在事件发生后被调用的函数。
*/
void Mbre_SetCb(mbre_callback_t callback_func);

#if (_MBRE_ROLE == 2)
// 设置本机角色
// role: MBRE_ROLE_SLAVE-从机，MBRE_ROLE_HOST-主机
void Mbre_SetRole(mbre_role_t role);
#endif

#if (_MBRE_ROLE != 1) // 以下为主机专用函数

/**
 * 发送查找从机命令（0x41）
*/
void Mbre_FindSlave(const u8 *uid, u8 uid_length);

/**
 * 发送重设ID命令：通过UID重设设备的ID。(0x42)
*/
void Mbre_ModifyId(const u8 *uid, u8 uid_length, u8 new_id);

/**
 * 设置目标设备（从机ID），后续的命令将针对此ID的从机.
 * 注意：在收到从机回应之前不要切换目标设备。
*/
void Mbre_SetTargetDevice(u8 slave_id);

/**
 * 发送READ命令(0X03)
*/
void Mbre_Read(u32 addr, u16 length);

/**
 * 发送 WRITE 命令(0X10)。通过获取从机的回应数据包来确定写入是否成功。
 * @param   length  数据字节数，不能超过 _MBRE_MAX_TX_DATA_LEN 或者 从机报告的数据包最大长度-16，否则无效。
 * @return  WRITE命令是否已发送，当长度过大时返回false。
*/ 
bool Mbre_Write(u32 addr, u8 *dat, u16 length);

/**
 * 发送动作指令（0x43）
 * @param act_code 0XF0代表开始软件升级，其他用户可以自己定义。
*/
void Mbre_Action(u8 act_code);

#endif

#if (_MBRE_ROLE != 0) // 以下为从机专用函数

/**
 * 返回READ命令的结果
 * @param dat 数据指针，无数据时为NULL
 * @param length 数据字节数
*/
void Mbre_ReturnRead(const u8 *dat, u16 length);

/**
 * 返回WRITE命令的结果
 * @param addr 同主机发送的起始地址
 * @param length 实际写入长度。如果写入范围覆盖了不可写区域，实际写入长度将与主机发送的写入长度不同。
 *      如果其值为零说明没有任何数据写入成功。
*/
void Mbre_ReturnWrite(u32 addr, u16 length);

/**
 * 返回ACTION命令的执行结果。
 * 如果执行动作的时间很短(<100ms)，将在执行后再返回结果，否则，先判断动作是否有执行条件，条件允许就立即返回结果。
 * 主机可能需要通过读取一些从机状态寄存器来确保执行的真实结果。
*/
void Mbre_ReturnAction(bool succeed);

#endif

#endif
